package com.fjwt.gz.components.mq.model;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fjwt.gz.components.mq.constant.MQSendTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


/**
*
* 定义MQ消息格式
* 业务场景： 活动导出报表
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExportExcelMQ extends AbstractMQ {

    /** 【！重要配置项！】 定义MQ名称 **/
    public static final String TOPIC_NAME = "QUEUE_EXPORT_EXCEL";
    public static final String GROUP_NAME = "QUEUE_EXPORT_EXCEL_GROUP";

    /** 内置msg 消息体定义 **/
    private MsgPayload payload;

    /**  【！重要配置项！】 定义Msg消息载体 **/
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class MsgPayload {
        /**
         * 导出任务ID
         */
        private Long exportTaskId;
    }

    @Override
    public String getMQName() {
        return TOPIC_NAME;
    }

    /**  【！重要配置项！】 **/
    @Override
    public MQSendTypeEnum getMQType(){
        return MQSendTypeEnum.QUEUE;  // QUEUE - 点对点 、 BROADCAST - 广播模式
    }

    @Override
    public String toMessage() {
        return JSONObject.toJSONString(payload);
    }

    /**  【！重要配置项！】 构造MQModel , 一般用于发送MQ时 **/
    public static ExportExcelMQ build(Long exportTaskId){
        return new ExportExcelMQ(new MsgPayload(exportTaskId));
    }

    /** 解析MQ消息， 一般用于接收MQ消息时 **/
    public static MsgPayload parse(String msg){
        return JSON.parseObject(msg, MsgPayload.class);
    }

    /** 定义 IMQReceiver 接口： 项目实现该接口则可接收到对应的业务消息  **/
    public interface IMQReceiver{
        void receive(MsgPayload payload);
    }

}
